package com.wujunshen.algorithm.leetcode.basic;

import java.util.Stack;

import lombok.extern.slf4j.Slf4j;

/**
 * @author frank woo(吴峻申) <br>
 *     email:<a href="mailto:frank_wjs@hotmail.com">frank_wjs@hotmail.com</a> <br>
 * @date 2022/6/30 23:14<br>
 */
@Slf4j
public class 有效的括号 {
  // 给定一个只包括 '('，')'，'{'，'}'，'['，']'的字符串 s ，判断字符串是否有效。
  // 有效字符串需满足：
  // 左括号必须用相同类型的右括号闭合。
  // 左括号必须以正确的顺序闭合。

  // 1 <= s.length <= 104
  // s 仅由括号 '()[]{}' 组成

  public static boolean isValid(String s) {
    // 1 <= s.length <= 104
    if (s.length() < 1 || s.length() > Math.pow(10, 4)) {
      throw new IllegalArgumentException("exception");
    }

    // s 仅由括号 '()[]{}' 组成
    if (!s.contains("(")
        && !s.contains(")")
        && !s.contains("[")
        && !s.contains("]")
        && !s.contains("{")
        && !s.contains("}")) {
      throw new IllegalArgumentException("exception");
    }

    if (s.length() % 2 == 1) {
      return false;
    }

    Stack<Character> stack = new Stack<>();
    for (char c : s.toCharArray()) {
      if (c == '(') {
        stack.push(')');
      } else if (c == '{') {
        stack.push('}');
      } else if (c == '[') {
        stack.push(']');
      } else if (stack.isEmpty() || stack.pop() != c) {
        return false;
      }
    }

    return stack.isEmpty();
  }

  public static void main(String[] args) {
    String s = "()";
    // true
    log.info("答案: {}", isValid(s));

    s = "()[]{}";
    // true
    log.info("答案: {}", isValid(s));

    s = "(]";
    // false
    log.info("答案: {}", isValid(s));

    s = "([)]";
    // false
    log.info("答案: {}", isValid(s));

    s = "{[]}";
    // true
    log.info("答案: {}", isValid(s));

    s = "11";
    // throws exception
    log.info("答案: {}", isValid(s));
  }
}
